import { ElMessage } from 'element-plus';
import { history } from 'umi';
import { extend, RequestOptionsWithResponse } from 'umi-request';
import { clearItem, getItem } from './storage';

const codeMessage: { [key: number]: string } = {
  200: '服务器成功返回请求的数据。',
  201: '新建或修改数据成功。',
  202: '一个请求已经进入后台排队（异步任务）。',
  204: '删除数据成功。',
  400: '请求参数错误',
  401: '用户没有权限（令牌、用户名、密码错误）。',
  403: '用户得到授权，但是访问是被禁止的。',
  404: '发出的请求针对的是不存在的记录，服务器没有进行操作。',
  406: '请求的格式不可得。',
  410: '请求的资源被永久删除，且不会再得到的。',
  422: '当创建一个对象时，发生一个验证错误。',
  500: '服务器发生错误，请检查服务器。',
  502: '网关错误。',
  503: '服务不可用，服务器暂时过载或维护。',
  504: '网关超时。',
};

/**
 * 异常处理程序
 */
const errorHandler = (error: any) => {
  const { response = {}, data } = error;
  const status: number = response?.status;
  const errortext = codeMessage[status] || response?.statusText;

  if (status === 401 || status === 403) {
    ElMessage({
      message: '身份验证失败',
      type: 'warning',
    });
    history.push('/user/login');
    clearItem('token');
    throw error;
  }
  ElMessage({
    message: data ? data.message : errortext || '请求出错',
    type: 'error',
  });
  throw error;
};

/**
 * 配置request请求时的默认参数
 */
const request = extend({
  errorHandler, // 默认错误处理
  credentials: 'same-origin', // 默认请求是否带上cookie
});

request.interceptors.request.use((url: any, options: any) => {
  const newOptions = {
    ...options,
    interceptors: true,
  };

  newOptions.headers.Authorization = getItem('token') ?? '';

  return {
    options: newOptions,
  };
});

request.interceptors.response.use(async (response, options) => {
  const data = await response.clone().json();
  if (!data?.success && data?.message) {
    ElMessage({
      message: data.message,
      type: 'error',
    });
  }
  // request(options.url, options)

  return response;
});

const requestInit = (
  url: string,
  options: RequestOptionsWithResponse,
  mock?: boolean,
) => {
  let isMock = REQUEST_MOCK;
  if (typeof mock != 'undefined') {
    isMock = mock;
  }

  url = `${isMock ? REQUEST_MOCK_URL : API_REQUEST_URL}${url}`;
  return request(url, options);
};

export default requestInit;
